// ts中的类 函数不能new 那么类可以创建实例。 类的特点既能当做值 也能当做类型

// 在我们ts中如果希望给实例添加属性 必须要提前声明出来
class Pointer {
  // x:number = 1 // 在定义x 和 y的时候初始化
  // y:number = 2
  constructor(private x: number, public y: number) {
    // 在构造函数中初始化
    //    this.x = x;
    //    this.y = y;
  }
}
let p = new Pointer(1, 2);
console.log(p);

// 我们期望把传入的参数直接作为实例属性可以增添public 关键字
// 类的修饰符 public(公开的) protected(受保护的) private（私有的）  用来表示属性使用的范围  ts
//           所有人都能访问   表示只有继承我的人可以访问   只有自己能访问

// public private readonly protected
class Animal {
  constructor(public readonly name: string) {
    // public private
    this.name = "jerry";
    console.log(this.name);
  }
  eat() {}
  static drink() {}
}
class Cat extends Animal {
  age: number;
  constructor(name: string, age: number) {
    super(name);
    this.age = age;
    // this.name = "zs"; // readonly 表示仅读属性 不能修改（初始化的时候可以修改 ）
  }
  eat() {
    super.eat(); // 指的是父类的原型
  }
  static drink() {
    super.drink();
  }
}
let tom = new Cat("tom", 12);
console.log(tom.name);
// readonly修饰符

// 原型方法 原型属性 静态方法 静态属性

class Person {
  x: string = "1";
  xxx: () => void;
  private eat() {}
  constructor() {
    this.x = "100";
    this.xxx = function () {};
  }
  a = 1; // es7 语法 也是实例属性
  static b = 2;
  static d() {}
  get c() {
    // Object.defineProperty 给原型上增加了一个c属性
    return 1000;
  }
}

let person = new Person();
console.log(person);

// super是一个关键字 不能直接使用 在原型方法中super指向父类的原型 ，在我们静态方法中指代的是父类
export {};
